#include <iostream>
#include <unistd.h>
#include <assert.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
using namespace std;

int main()
{
    // 首先创建管道
    int pipefd[2] = {0};  // r、w写对应的fd
    int n = pipe(pipefd);
    assert(n == 0);
    (void)n;  // 防止Release版本出现问题 - 被过度优化掉
    // 创建子进程，父进程关闭读fd 子进程关闭写fd - 管道建立
    pid_t id = fork();
    if (id == 0)
    {
        // 子进程
        close(pipefd[1]);
        sleep(2);
        char* buffer[1024] = {0};
        ssize_t i = read(pipefd[0], buffer, sizeof(buffer) - 1);
        printf("%s\n", buffer);
        exit(0);
    }
    // 父进程
    close(pipefd[0]);
    const char* buffer = "i am father";
    write(pipefd[1], buffer, strlen(buffer));
    // 等待子进程
    pid_t wn = waitpid(id, nullptr, 0);  // 阻塞式等待指定子进程，没有给输出型参数 
    assert(wn == id);  // 此时才正确
    (void)wn;  // 同理防止被优化
    
    return 0;
}